package cn.ant.Client;

import cn.ant.utils.ChannelUtil;
import com.rabbitmq.client.Channel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 消费者（消费任务）
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
public class Consumer {

    // 通过日志管理器获取Logger对象
    static Logger logger = LogManager.getLogger(Consumer.class);
    // 单个发布确认
    public static final String SINGLE_RELEASE_CONFIRMATION = "singleReleaseConfirmation";
    // 批量确认
    public static final String BATCH_CONFIRMATION = "batchConfirmation";
    // 异步发布确认
    public static final String ASYNC_RELEASE_CONFIRMATION = "asyncReleaseConfirmation";

    // 同时启动三个消费者；也可以需要哪个消费者就启动哪个消费者
    public static void main(String[] args) throws IOException {
        singleReleaseConfirmation();
        batchConfirmation();
        asyncReleaseConfirmation();
    }

    /***
     * 单个发布确认-消费者代码
     */
    public static void singleReleaseConfirmation() throws IOException {
        // 通过工具类获取一个信道
        Channel channel = ChannelUtil.getChannel();
        // 提前声明一个需要的队列，以防先启动消费者后发现队列不存在报错
        channel.queueDeclare(SINGLE_RELEASE_CONFIRMATION, true, false, false, null);
        logger.info("单个发布确认-消费者开始监听队列消息....");

        // 消费者消费消息-自动确认消息
        channel.basicConsume(SINGLE_RELEASE_CONFIRMATION, true, (consumerTag, message) -> {
            // 获取从队列取出的数据并打印
            String str = new String(message.getBody(), StandardCharsets.UTF_8);
            logger.info("单个发布确认-消费者获取队列信息并处理：{}", str);
        }, consumerTag -> {
            logger.info("监听的队列出现异常；可能队列被删除！{}", consumerTag);
        });
    }

    /***
     * 批量确认-消费者代码
     */
    public static void batchConfirmation() throws IOException {
        // 通过工具类获取一个信道
        Channel channel = ChannelUtil.getChannel();
        // 提前声明一个需要的队列，以防先启动消费者后发现队列不存在报错
        channel.queueDeclare(BATCH_CONFIRMATION, true, false, false, null);
        logger.info("批量确认-消费者开始监听队列消息....");

        // 消费者消费消息-自动确认消息
        channel.basicConsume(BATCH_CONFIRMATION, true, (consumerTag, message) -> {
            // 获取从队列取出的数据并打印
            String str = new String(message.getBody(), StandardCharsets.UTF_8);
            logger.info("批量确认-消费者获取队列信息并处理：{}", str);
        }, consumerTag -> {
            logger.info("监听的队列出现异常；可能队列被删除！{}", consumerTag);
        });
    }

    /***
     * 异步发布确认-消费者代码
     */
    public static void asyncReleaseConfirmation() throws IOException {
        // 通过工具类获取一个信道
        Channel channel = ChannelUtil.getChannel();
        // 提前声明一个需要的队列，以防先启动消费者后发现队列不存在报错
        channel.queueDeclare(ASYNC_RELEASE_CONFIRMATION, true, false, false, null);
        logger.info("异步发布确认-消费者开始监听队列消息....");

        // 消费者消费消息-自动确认消息
        channel.basicConsume(ASYNC_RELEASE_CONFIRMATION, true, (consumerTag, message) -> {
            // 获取从队列取出的数据并打印
            String str = new String(message.getBody(), StandardCharsets.UTF_8);
            logger.info("异步发布确认-消费者获取队列信息并处理：{}", str);
        }, consumerTag -> {
            logger.info("监听的队列出现异常；可能队列被删除！{}", consumerTag);
        });
    }
}
